package com.hanamaki.jdbc.until;

import com.hanamaki.jdbc.until.JDBC_Util;

import java.sql.*;

/**
 * @author hanamaki
 * @version 1.0
 * @date 2021/7/1 13:49
 */
public class JDBC_Util_Test {

    public static void main(String[] args) throws Exception {

        testJdbc("scores");

//        login(" ' or ' 1=1 ", " ' or ' 1=1 ");
//        login_preParStatement(" ' or ' 1=1 ", " ' or ' 1=1 ");

//        insertInfo("来福", "常威");
//        updateInfo(4, "123456");
//        deleteInfo(4);

//        transAction(1, 3, 5000);

    }

    // Sql注入  Login 测试
    /**
     * 登录接口
     * @param username 用户名
     * @param password 密码
     */
    public static void login(String username,String password) throws Exception{
        Connection con = JDBC_Util.getCon();
        String sql = "select * from login where username = '" + username + "' and password = '" + password+"'";
        System.out.println(sql);
        Statement statement = con.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()) {
            String name = resultSet.getString(2);
            String pwd = resultSet.getString(3);

            System.out.println(name + "---" + pwd);
        }

    }

    // 防止 Sql注入  Login 测试
    /**
     * 登录接口
     * @param username 用户名
     * @param password 密码
     */
    public static void login_preParStatement(String username,String password) throws Exception{
        Connection con = JDBC_Util.getCon();
        String sql = "select * from login where username = ? and password = ?";
        System.out.println(sql);
        PreparedStatement preparedStatement = con.prepareStatement(sql);
        preparedStatement.setString(1, username);
        preparedStatement.setString(2, password);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            String name = resultSet.getString(2);
            String pwd = resultSet.getString(3);

            System.out.println(name + "---" + pwd);
        }

    }

    /**
     * Java操作数据库 添加
     */
    public static void insertInfo(String username, String password) throws Exception{

        Connection con = JDBC_Util.getCon();

        PreparedStatement preparedStatement = null;

//        编写 添加的 sql
        String sql = "INSERT INTO `login`( `username`, `password`) VALUES (?, ?)";
//        执行sql
        preparedStatement = con.prepareStatement(sql);
        //        为 占位符 添加 参数
        preparedStatement.setString(1, username);
        preparedStatement.setString(2, password);
//        executeUpdate 可以执行 增  删 改
        int i = preparedStatement.executeUpdate();

        if (i > 0) {
            System.out.println("增加成功！");
        }


    }

    /**
     * Java操作数据库 修改
     */
    public static void updateInfo(int id, String password) throws Exception{

        Connection con = JDBC_Util.getCon();
        PreparedStatement preparedStatement = null;

//        编写 修改的 sql
        String sql = "update login set password = ? where id = ?";
//        执行sql
        preparedStatement = con.prepareStatement(sql);
        //        为 占位符 添加 参数
        preparedStatement.setString(1, password);
        preparedStatement.setInt(2, id);
//        executeUpdate 可以执行 增  删 改
        int i = preparedStatement.executeUpdate();

        if (i > 0) {
            System.out.println("修改成功！");
        }


    }

    /**
     * Java操作数据库 删除
     */
    public static void deleteInfo(int id) throws Exception{

        Connection con = JDBC_Util.getCon();
        PreparedStatement preparedStatement = null;

//        编写 添加的 sql
        String sql = "delete from login where id = ?";
//        执行sql
        preparedStatement = con.prepareStatement(sql);
        //        为 占位符 添加 参数
        preparedStatement.setInt(1, id);
//        executeUpdate 可以执行 增  删 改
        int i = preparedStatement.executeUpdate();

        if (i > 0) {
            System.out.println("删除成功！");
        }


    }

    /**
     * 事务：一组 SQL 语句 在同一批次被执行 要么同时成功 要么都不成功
     * 转账的事务
     * @param transferPersonId  转账人 id
     * @param payeeId 收账人 id
     * @param money  钱
     */
    public static void transAction(int transferPersonId,int payeeId, long money) throws SQLException {
//        想要写 事务，就要将 事务的 自动提交 给关闭
        Connection con = null;
        try {
            con = JDBC_Util.getCon();
//             将 事务的 自动提交 关闭
            con.setAutoCommit(false);
//            创建 sql语句 转账人的 sql 少
            String sql1 = "update login set money = money - ? where id = ?";
//            创建一个 执行  sql的对象
            PreparedStatement preparedStatement = con.prepareStatement(sql1);
            preparedStatement.setLong(1, money);
            preparedStatement.setInt(2, transferPersonId);
            preparedStatement.executeUpdate();

//            模拟 异常
            int i = 1 / 0;

            String sql2 = "update login set money = money + ? where id = ?";
            preparedStatement = con.prepareStatement(sql2);
            preparedStatement.setLong(1, money);
            preparedStatement.setInt(2, payeeId);

            preparedStatement.executeUpdate();

//            如果 没有问题 事务可以直接 提交
            System.out.println("事务成功");
            con.commit();
        } catch (Exception e) {
//            如果事务 出现异常 就会滚
            System.out.println("事务失败");
            con.rollback();
        }


    }


    // 测试 JDBC 简单的工具类的使用
    /**
     *
     * @param tableName  想要查询的表的名称
     */
    public static void testJdbc(String tableName) {
        Connection con = JDBC_Util.getCon();
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            statement = con.createStatement();
            String sql = "select * from " + tableName;
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                System.out.println(resultSet.getObject(1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBC_Util.refresh(con, statement, resultSet, null);
        }
    }
}
